# -*- coding:utf-8 -*-
# title           :
# description     :
# author          :Python超人/三月三提供
# date            :2024-06-01
# link            :https://gitcode.net/pythoncr/
# python_version  :3.9
# ==============================================================================
import math

from 神笔码靓.神笔库.神笔绘图板 import 神笔绘图板
from 神笔码靓.神笔库.定义集 import *
from 神笔码靓.神笔库.配置 import *
from 神笔码靓.神笔库.通用工具集 import *


class 记谱符号:
    低音谱号 = "低音谱号"
    高音谱号 = "高音谱号"
    无 = None


class 五线谱打印模板(神笔绘图板):
    五线谱高度 = 35
    线宽 = 0.5
    线颜色 = 颜色.黑色
    行间隔 = 100

    def 页面设置(self, 设置: 纸张设置):
        # 输出 PDF 文件，以及 页面打印，在这里设置好
        设置.上页边距 = "0cm"
        设置.下页边距 = 0
        设置.左页边距 = "0cm"
        设置.右页边距 = 0
        设置.页面方向 = 纸张方向.自动识别
        设置.页面尺寸规格 = "A4"
        设置.页面缩放 = 1.0

    def 五线谱字体对应关系(self):
        for i, c in 索引列举(
                ["!", '"', "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4",
                 "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H",
                 "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\",
                 "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p",
                 "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~"]):
            y = (i % 20 + 2) * 12
            x = 10 + math.floor(i / 20) * 40
            self.写字(x=x, y=y, 文字=c, 字体大小=5)
            self.写字(x=x + 10, y=y, 文字=c, 字体大小=5, 字体="五线谱字体")

    def _五线谱(self):
        # ) #  $  *
        字体大小 = 100
        for x in range(10):
            if x == 0:
                # self.写字(x=(x + 1) * 字体大小, y=字体大小 * 2, 文字=")", 字体大小=字体大小, 字体="五线谱字体", 水平基线对齐=文字水平基线对齐.起始点对齐)
                self.写字(x=(x + 1) * 字体大小, y=字体大小 * 2, 文字="*", 字体大小=字体大小, 字体="五线谱字体", 水平基线对齐=文字水平基线对齐.起始点对齐)
            else:
                self.写字(x=(x + 1) * 字体大小, y=字体大小 * 2, 文字="'", 字体大小=字体大小, 字体="五线谱字体", 水平基线对齐=文字水平基线对齐.起始点对齐)

    def 五线谱(self, y, 谱号=None, 线开始位置=40, 线结束位置=740):
        """

        :param 谱号: 低音谱号、中音谱号、高音谱号
        :param 开始Y:
        :return:
        """
        for i in range(5):
            self.画水平线(x1=线开始位置, x2=线结束位置, y1=y, y2=y + self.五线谱高度, 数量=5, 描边宽度=self.线宽, 描边颜色=self.线颜色)
            if i == 0:
                if 谱号 == 记谱符号.高音谱号:
                    self.写字(x=线开始位置 + 0, y=y + 26.5, 文字="$", 字体大小=33.0, 字体="五线谱字体",
                            水平基线对齐=文字水平基线对齐.起始点对齐, 垂直基线对齐=文字垂直基线对齐.中线对齐)
                elif 谱号 == 记谱符号.低音谱号:
                    self.写字(x=线开始位置 + 0, y=y + 25.5, 文字="#", 字体大小=33.5, 字体="五线谱字体",
                            水平基线对齐=文字水平基线对齐.起始点对齐, 垂直基线对齐=文字垂直基线对齐.中线对齐)

    def 记谱说明(self, 说明=None, 线开始位置=40, 开始偏移=0, y=0):
        if 说明 is not None:
            self.写字(x=线开始位置 + 开始偏移, y=y,
                    文字=说明, 字体=系统字体.微软雅黑, 字体大小=16,
                    水平基线对齐=文字水平基线对齐.起始点对齐)
            w, h = 获取文字的宽高(系统字体.微软雅黑, 16, 说明)
            线开始位置 = 线开始位置 + w * 0.75 + 5
        return 线开始位置

    def 高音谱号记谱(self, y=90, 线开始位置=40, 线结束位置=740, 说明=None):
        线开始位置 = self.记谱说明(说明=说明, 线开始位置=线开始位置, y=y + self.五线谱高度 / 2)
        self.五线谱(y=y, 谱号=记谱符号.高音谱号, 线开始位置=线开始位置, 线结束位置=线结束位置)
        开始线 = [(线开始位置, y), (线开始位置, y + self.五线谱高度),
               ("M", 线结束位置, y), (线结束位置, y + self.五线谱高度)]
        self.连线(开始线, 描边宽度=self.线宽, 描边颜色=self.线颜色)

    def 低音谱号记谱(self, y=190, 线开始位置=40, 线结束位置=740, 说明=None):
        线开始位置 = self.记谱说明(说明=说明, 线开始位置=线开始位置, y=y + self.五线谱高度 / 2)
        self.五线谱(y=y, 谱号=记谱符号.低音谱号, 线开始位置=线开始位置, 线结束位置=线结束位置)
        开始线 = [(线开始位置, y), (线开始位置, y + self.五线谱高度),
               ("M", 线结束位置, y), (线结束位置, y + self.五线谱高度)]
        self.连线(开始线, 描边宽度=self.线宽, 描边颜色=self.线颜色)

    def 高低音谱号记谱(self, y=90, 线开始位置=40, 线结束位置=740, 说明=None):
        线开始位置 = self.记谱说明(说明=说明, 线开始位置=线开始位置, 开始偏移=-10,
                          y=y + (self.行间隔 - self.五线谱高度) / 2 + self.五线谱高度)
        # 线开始位置 = 线开始位置 + 5
        self.五线谱(y=y, 谱号=记谱符号.高音谱号, 线开始位置=线开始位置, 线结束位置=线结束位置)
        self.五线谱(y=y + self.行间隔, 谱号=记谱符号.低音谱号, 线开始位置=线开始位置, 线结束位置=线结束位置)
        # self.画点(x=线开始位置 - 5, y=y + (self.行间隔 - self.五线谱高度) / 2 + self.五线谱高度)
        self.写字(x=线开始位置 - 5, y=y + (self.行间隔 - self.五线谱高度) / 2 + self.五线谱高度 + 0.8, 文字="{",
                字体="Engravers MT", 垂直基线对齐=文字垂直基线对齐.中线对齐).缩放(2, 9.7)

        开始线 = [(线开始位置, y), (线开始位置, y + self.行间隔 + self.五线谱高度),
               ("M", 线结束位置, y), (线结束位置, y + self.行间隔 + self.五线谱高度)]
        self.连线(开始线, 描边宽度=self.线宽, 描边颜色=self.线颜色)

    def 修改文件名(self, 原始文件名: str):
        if hasattr(self, "版面"):
            return "#版面#", f"_{self.版面}"
        return None

    def 版面3(self):
        for r in range(5):
            if r == 0:
                说明 = "钢琴"
            else:
                说明 = None
            self.高低音谱号记谱(r * self.行间隔 * 2 + 90, 说明=说明)

    def 版面4(self):
        for r in range(5):
            self.高低音谱号记谱(r * self.行间隔 * 2 + 90)

    def 版面1(self):
        for r in range(10):
            self.高音谱号记谱(r * self.行间隔 + 90)

    def 版面2(self):
        for r in range(10):
            self.低音谱号记谱(r * self.行间隔 + 90)

    def 创作(self):
        # self.五线谱字体对应关系()

        self.显示图框()
        # self.显示网格(网格线距=20, 网格颜色=颜色.暗灰色, 网格透明度=1, 网格字体大小=9)

        # self.贴图(x=0, y=50, 图片文件=资源库目录(r"图片\五线谱.jpg"), 缩放=1.2)
        # self.贴图(x=-90, y=-130, 图片文件=资源库目录(r"五线谱1.png"), 缩放=0.4, 透明度=0.2)
        if hasattr(self, "版面"):
            m = getattr(self, "版面")
            m = getattr(self, m)
            if callable(m):
                m()


if __name__ == '__main__':
    # 作品文件路径：保存的 SVG（矢量图）格式的文件路径名称
    # 宽: 神笔绘图板也需要设置页面的宽度
    # 高: 神笔绘图板也需要设置页面的高度
    宽, 高 = 纸张大小.A4_纵向(1)
    for m in ["版面1", "版面2", "版面3", "版面4"]:
        五线谱 = 五线谱打印模板(作品文件路径="五线谱#版面#.svg", 宽=宽, 高=高)
        五线谱.版面 = m
        五线谱.完成()
        五线谱.生成PDF()
